#ifndef __CFONT___
#define __CFONT___

//includes
#include "CObject.h"
#include "CVector.h"
#include "CFrame.h"
#include "CAnimation.h"
#include "STL.h"

//protótipos
class CCore;
class CLayer;
class CImage;

typedef struct {
    CImage * p_FontImage;
    int CharPos[512];
    int MaxPos;
} FontStruct;

/*!
 Esta classe contém o font configurado, com posição, animações e espelhamentos.
*/
class CFont : public CObject
{
    private:
        void ParseImage();

    public:

        //!Indica se o font está visível ou não.
        bool    bVisible;

        //!Posição (x,y) do font na layer.
        CVector Position;

        //!Lista de animações.
        std::vector<CAnimation*> Animations;

        //!Indica a animação corrente do font.
        short sCurrentAnim;

        //!Ponteiro para o CCore.
        CCore   *pr_Core;

        //!Referência para a layer à qual este font pertence.
        CLayer  *pr_Layer;

        CImage  *pr_Image;

        CImage  *p_fontBuffer;

        FontStruct *p_Font;

        std::string strTextBuffer;

        /*!
        Construtor padrão.
        */
        CFont(void);

        /*!
        Destrutor padrão.
        */
        ~CFont(void);

        /*!
            Finaliza a classe.
            \return verdadeiro se a operação foi bem sucedida, caso contrário retorna falso.
        */
        bool Release(void);

        /*!
            Cria o font.
            \param pc_FileName: Nome do arquivo da imagem fonte.
            \param cFrameSize: Tamanho do quadro na imagem fonte.
            \return verdadeiro se a operação foi bem sucedida, caso contrário retorna falso.
        */
        bool Create(const std::string pc_FileName, const CVector &cFrameSize);

        void Write(const std::string & strText, int x, int y);

        /*!
            Desenha o font no BackBuffer.
        */
        void Draw(void);
        /*!
            Atualiza o font
        */


        void Update(void);

        /*!
            Adiciona uma animação ao font.
            \param iFPS: Número de quadros por segundo.
            \param bRepeat: Indica se a animação é contínua ou finita.
            \param iFrameCount: Número de quadros da animação.
            \param ...: Índices dos quadros da animação.
        */
        void AddAnimation(int iFPS,bool bRepeat, int iFrameCount,...);


        /*!
            Reinicia a animação corrente.
        */
        void ResetAnimation(void);

        /*!
            Ajusta a animação corrente.
            \param sAnim: Indice da nova animação.
        */
        void SetCurrentAnimation(short sAnim);

        /*!
            Exclui todas as animações do vetor "Animations".
        */
        void ClearAnimations(void);

        /*!
            Retorna o frame atual do font.
            \return Retorna um CFrame contendo o frame atual.
        */
        CFrame GetFrame(void);

};

#endif
